package main

import "fmt"

func main() {
	// 在其他语言里，宕机往往以异常的形式存在，底层抛出异常，上层逻辑通过 try/catch 机制捕获异常，
	// 没有被捕获的严重异常会导致宕机，捕获的异常可以被忽略，让代码继续运行。
	// Go语言没有异常系统，其使用 panic 触发宕机类似于其他语言的抛出异常，recover 的宕机恢复机制就对应其他语言中的 try/catch 机制。
	defer func() {
		e := recover() // recover 内建函数用于恢复宕机，必须在 defer 中调用
		if e != nil {
			fmt.Println("宕机信息：", e)
		}
	}()
	var flag bool = false
	if !flag {
		panic("资源缺失，触发宕机")
	}

	// 使用保护函数
	protect(func() {
		panic("主动触发宕机")
	})
}

// 保护函数，做一些事情、继续抛出错误
func protect(maybePanicfn func()) {
	defer func() {
		e := recover()
		if e != nil {
			fmt.Println("protect 宕机信息：", e)
			// 继续抛出错误
			panic(fmt.Errorf("protect 继续抛出错误: %v", e))
		}
	}()
	maybePanicfn()
}

// 宕机与恢复机制的设计目标：
// 1. 简单易用： 不引入复杂的异常系统，保持语言简洁；
// 2. 明确语义： 宕机用于不可恢复的严重错误，恢复机制用于有限范围内的错误处理；
// 3. 资源释放： 保证在宕机时仍能执行必要的清理操作，防止资源泄漏；
// 4. 可控性： 开发者可以选择性地捕获和处理宕机，避免滥用导致代码混乱。
// 5. 性能考虑： 宕机和恢复机制在正常情况下开销较小，不影响程序的整体性能。
